//
//  JGMainViewController.m
//  MakeBricksGame
//
//  Created by mac on 15/8/13.
//  Copyright (c) 2015年 Free. All rights reserved.
//

#import "JGMainViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface JGMainViewController ()
{
    // 小球的初始位置
    CGPoint         _originBallCenter;
    // 挡板的初始位置
    CGPoint         _originPaddleCenter;
    
    // 游戏时钟
    CADisplayLink   *_gameTimer;/////////////
    
    // 小球的速度
    CGPoint         _ballVelocity;////////////
    
    // 挡板的水平速度
    CGFloat         _paddleVelocityX;
}

@end

@implementation JGMainViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    
    // 记录小球初始中心点位置
    _originBallCenter = _ballImageView.center;
    
    // 记录挡板初始中心点位置
    _originPaddleCenter = _paddleImageView.center;
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - 碰撞检测方法
//与屏幕的碰撞检测-------------
- (void)intersectWithScreen
{
    //与屏幕上方的碰撞检测
    if (CGRectGetMinY(_ballImageView.frame) <= 0) {
        _ballVelocity.y = ABS(_ballVelocity.y); // 垂直速度取反
    }
    
    // 与屏幕左侧的碰撞检测
    if (CGRectGetMinX(_ballImageView.frame) <= 0) {
        _ballVelocity.x = ABS(_ballVelocity.x); // 水平速度取反
    }
    
    
    // 与屏幕右侧的碰撞检测
    if (CGRectGetMaxX(_ballImageView.frame) >= self.view.bounds.size.width) {
        _ballVelocity.x = -ABS(_ballVelocity.x); // 水平速度取反
    }
    
    // 从屏幕下方掉出，游戏结束
    if (CGRectGetMidY(_ballImageView.frame) >= self.view.bounds.size.height) {
        NSLog(@"哎呀，下次继续加油吧！");
        
        //关闭时钟
        [_gameTimer invalidate];
        
        //提示用户重现开始
        [_messageImage setHidden:NO];
        
        [_messageLabel setHidden:NO];
        [_messageLabel setText:@"哎呀，下次继续加油吧！"];
        
        // 启用点击屏幕手势识别
        [_tapGesure setEnabled:YES];
    }
    
}

// 与砖块的碰撞检测
/*CGRectIntersectsRect(rect 1.feet 2)可以判断矩形结构是否交叉，两个矩形对象是否重叠。
检测两个图标是否碰撞.
 */
- (void)intersectWithBlocks
{
    NSLog(@"%lu",(unsigned long)_blockImages.count);
    
    for (UIImageView *block in _blockImages) {
         // 循环检测砖块是否与小球碰撞，如果发生碰撞，翻转小球的速度
        if (CGRectIntersectsRect(block.frame, _ballImageView.frame) && ![block isHidden]) {
            // 把砖块隐藏起来
            [block setHidden:YES];
            
            // 翻转小球Y方向速度
            _ballVelocity.y *= -1;/////////////////////////
        }
    }
    
    
    // 所有的砖块都被隐藏了，说明游戏胜利
    BOOL win = YES;
    for (UIImageView *block in _blockImages) {
        if (![block isHidden]) {
            win = NO;
            break;
        }
    }
    
    // 游戏胜利的处理
    if (win) {
        // 关闭时钟
        [_gameTimer invalidate];
        
        // 提示用户输了
         [_messageImage setHidden:NO];
        [_messageLabel setHidden:NO];
        [_messageLabel setText:@"真棒，你赢啦！点击再来一局吧！"];
        // 启用点击屏幕手势识别
        [_tapGesure setEnabled:YES];
    }
}


// 与挡板的碰撞检测
-(void)intersectWithPaddle
{
    if (CGRectIntersectsRect(_paddleImageView.frame, _ballImageView.frame)) {
        // 小球Y方向速度翻转
        _ballVelocity.y = -ABS(_ballVelocity.y);
        
        // 增加小球水平方向的速度，简单修正一下小球的水平速度
        _ballVelocity.x +=_paddleVelocityX / 120.0;///////////////
    }
}


// 屏幕刷新时执行的方法
- (void)step
{
    NSLog(@"屏幕刷新了---------");
    [self intersectWithScreen];
    [self intersectWithBlocks];
    [self intersectWithPaddle];
    
    // 更新小球位置
    [_ballImageView setCenter:CGPointMake(_ballImageView.center.x + _ballVelocity.x, _ballImageView.center.y + _ballVelocity.y)];
    
}

// 点击屏幕，开始游戏
- (IBAction)tapScreen:(id)sender {
    NSLog(@"game begin---------");
    
    // 禁用点击屏幕手势识别
    [_tapGesure setEnabled:NO];
    
    // 消息标签隐藏
    [_messageImage setHidden:YES];
    [_messageLabel setHidden:YES];
    // 小球
    [_ballImageView setCenter:_originBallCenter];
    // 挡板
    [_paddleImageView setCenter:_originPaddleCenter];
    
    // 砖块，把隐藏的砖块恢复
    for (UIImageView *block in _blockImages) {
        [block setHidden:NO];
    }

    // 给小球设置初始速度
    _ballVelocity = CGPointMake(0.0, -5.0);
    
    // 定义游戏时钟
    _gameTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)];
    // 把游戏时钟添加到主运行循环中
    [_gameTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}


- (IBAction)dragPaddle:(UIPanGestureRecognizer *)sender {
    // 拖拽手指时，改变挡板的位置
    // 需要判断手指是否在拖动
    
    if (UIGestureRecognizerStateChanged == sender.state) {
        // 取出手指移动到的位置
        CGPoint location = [sender locationInView:self.view];
        // 将挡板的水平位置设置为手指的位置
        [_paddleImageView setCenter:CGPointMake(location.x, _paddleImageView.center.y)];
        if (!_messageImage.hidden) {
            [_ballImageView setCenter:CGPointMake(location.x, _ballImageView.center.y)];
        }
        
        // 记录挡板的水平移动速度
        _paddleVelocityX = [sender velocityInView:self.view].x;

    } else if (UIGestureRecognizerStateEnded == sender.state) {
        // 恢复手指移动速度
        _paddleVelocityX = 0;
    }
    
}

@end
